package com.tankgame;


import java.util.Vector;

/**
 * @author 周超
 * @version 1.0
 */
@SuppressWarnings({"all"})
public class EnemyTank extends Tank implements Runnable
{

    //在敌人坦克类中，使用Vector 保存多个Shot
    Vector<Shot> shots = new Vector<>();
    //增加成员，让每一个EnemyTank对象可以得到所有敌人坦克（敌人坦克集合Vector），
    //让EnemyTank对象与Vector里面的所有敌人坦克进行比较，看看是否发生了重叠

    Vector<EnemyTank> enemyTanks = new Vector<>();
    boolean isLive = true;
    public EnemyTank(int x, int y)
    {
        super(x, y);
    }

    //怎么让类EnemyTank获取到类MyPanel里面的Vector<EnemyTank> enemyTanks属性？
    //答：这里提供一个方法，可以将MyPanel 的成员 Vector<EnemyTank> enemyTanks设置到类EnemyTank
    //的成员Vector<EnemyTank> enemyTanks，只要在类MyPanel里面调用setEnemyTanks即可

    //***现在每一个敌人坦克对象EnemyTank是可以持有或者得到敌人坦克集合Vector<EnemyTank> enemyTanks
    public void setEnemyTanks(Vector<EnemyTank> enemyTanks)
    {
        this.enemyTanks = enemyTanks;
    }

    //编写方法：防止敌人坦克重叠
    //判断当前的这个敌人坦克，是否和集合enemyTanks中的其它坦克发生了重叠或者是碰撞
    public boolean isTouchEnemytank() //返回true代表发生碰撞，反之亦然，
    // 在想一想这个方法应该放在哪里合适？————>类EnemyTank里的run()方法
    {
        //判断当前敌人坦克(this)的方向
        switch(this.getDirect())
        {
            case 0:  //this的敌人坦克向上
                //for循环，把所有的敌人坦克都取出来，让当前敌人坦克跟所有坦克进行比较
                for (int i = 0; i < enemyTanks.size(); i++)
                {
                    //从Vector中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //首先是不和自己进行比较
                    if (enemyTank != this)
                    {
                        //如果其它敌人坦克是上/下
                        //老韩分析
                        //1.如果其它敌人坦克是上/下 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 60]

                        //如果其它敌人坦克是上/下
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2)
                        {
                            //2. 当前坦克左上角的坐标 [this.getX(), this.getY()]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                            //3. 当前坦克右上角的坐标 [this.getX() + 40, this.getY()]
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                        }

                        //如果其它敌人坦克是右/左
                        //1.如果其它敌人坦克是右/左 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3)
                        {
                            //2. 当前坦克左上角的坐标 [this.getX(), this.getY()]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40)
                            {
                                return true;
                            }

                            //3. 当前坦克右上角的坐标 [this.getX() + 40, this.getY()]
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40)
                            {
                                return true;
                            }
                        }
                    }
                }
                break;


            case 1:  //this的敌人坦克向右
                //for循环，把所有的敌人坦克都取出来，让当前敌人坦克跟所有坦克进行比较
                for (int i = 0; i < enemyTanks.size(); i++)
                {
                    //从Vector中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //首先是不和自己进行比较
                    if (enemyTank != this)
                    {
                        //如果其它敌人坦克是上/下
                        //老韩分析
                        //1.如果其它敌人坦克是上/下 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 60]

                        //如果其它敌人坦克是上/下
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2)
                        {
                            //2. 当前坦克右上角的坐标 [this.getX() + 60, this.getY()]
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                            //3. 当前坦克右下角的坐标 [this.getX() + 60, this.getY() + 40]
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                        }

                        //如果其它敌人坦克是右/左
                        //1.如果其它敌人坦克是右/左 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3)
                        {
                            //2. 当前坦克右上角的坐标 [this.getX() + 60, this.getY()]
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40)
                            {
                                return true;
                            }

                            //3. 当前坦克右下角的坐标 [this.getX() + 60, this.getY() + 40]
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40)
                            {
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:  //this的敌人坦克向下
                //for循环，把所有的敌人坦克都取出来，让当前敌人坦克跟所有坦克进行比较
                for (int i = 0; i < enemyTanks.size(); i++)
                {
                    //从Vector中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //首先是不和自己进行比较
                    if (enemyTank != this)
                    {
                        //如果其它敌人坦克是上/下
                        //老韩分析
                        //1.如果其它敌人坦克是上/下 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 60]

                        //如果其它敌人坦克是上/下
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2)
                        {
                            //2. 当前坦克左下角的坐标 [this.getX(), this.getY() + 60]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                            //3. 当前坦克右下角的坐标 [this.getX() + 40, this.getY() + 60]
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                        }

                        //如果其它敌人坦克是右/左
                        //1.如果其它敌人坦克是右/左 x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                      y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3)
                        {
                            //2. 当前坦克左下角的坐标 [this.getX(), this.getY() + 60]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40)
                            {
                                return true;
                            }

                            //3. 当前坦克右下角的坐标 [this.getX() + 40, this.getY() + 60]
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40)
                            {
                                return true;
                            }
                        }
                    }
                }

                break;
            case 3:  //this的敌人坦克向左
                //让当前敌人坦克和其它所有的敌人坦克比较
                for (int i = 0; i < enemyTanks.size(); i++)
                {
                    //从Vector 中取出一个敌人坦克
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较
                    if (enemyTank != this)
                    {
                        //如果敌人坦克是上/下
                        //老韩分析
                        //1. 如果敌人坦克是上/下 x的范围 [enemyTank.getX(), enemyTank.getX() + 40]
                        //                    y的范围 [enemyTank.getY(), enemyTank.getY() + 60]

                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2)
                        {
                            //2. 当前坦克 左上角的坐标 [this.getX(), this.getY() ]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                            //3. 当前坦克 左下角的坐标 [this.getX(), this.getY() + 40]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60)
                            {
                                return true;
                            }
                        }
                        //如果敌人坦克是 右/左
                        //老韩分析
                        //1. 如果敌人坦克是右/左  x的范围 [enemyTank.getX(), enemyTank.getX() + 60]
                        //                     y的范围 [enemyTank.getY(), enemyTank.getY() + 40]
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3)
                        {
                            //2. 当前坦克 左上角的坐标 [this.getX(), this.getY() ]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40)
                            {
                                return true;
                            }
                            //3. 当前坦克 左下角的坐标 [this.getX(), this.getY() + 40]
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40)
                            {
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
    }

    @Override
    public void run()
    {
        while (true)
        {
            /*
            如何让敌人坦克发射多颗子弹？
            当敌人坦克的子弹集合Vector<Shot> shots的size == 0，说明集合里面没有子弹，这个时候
            就会自动创建一颗子弹对象，并且放入到shots集合，同时保证此时的敌人坦克没有被爆炸（爆炸
            了就不能打子弹了呀），最后启动这颗子弹的线程
             */
            //敌人坦克最多可以同时打出3颗子弹
            if (shots.size() <= 3 && this.isLive == true)
            {
                Shot shot = null;
                //判断此时敌人坦克的方向，创建对应的子弹
                switch (this.getDirect())
                {
                    case 0://向上
                        shot = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1://向右
                        shot = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2: //向下
                        shot = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3: //向左
                        shot = new Shot(getX(), getY() + 20, 3);
                        break;
                }
                //根据方向创建好子弹后，加入到Vector<Shot> shots集合中去
                shots.add(shot);
                //启动该线程
                new Thread(shot).start();
            }


            //如何让敌人坦克自由移动？
            //获取到当前敌人坦克的方向，然后朝着这个方向移动，添加继续朝一个方向持续移动的条件
            switch (this.getDirect())
            {
                case 0://向上
                    //只走了一步的speed值，让敌人坦克改变方向，距离太短，所以看起来怪怪的，
                    //让坦克保持一个方向，走50步，增加for()循环，以下情况一样
                    for (int i = 0; i < 95; i++)
                    {
                        /**
                         * 控制敌人的坦克在规定的范围移动，也就是添加if()语句，控制敌方坦克
                         * 的初始关键点x，y，不要让其超出窗口大小this.setSize(1000,750)，
                         * 以下同理
                         */
                        if (getY() > 0 && isTouchEnemytank() == false)
                        {
                            moveUp();
                        }
                        //不能让看起来是瞬移过去的，所以要进行休眠，以下情况同理
                        try {
                            Thread.sleep(40);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1://向右
                    for (int i = 0; i < 95; i++)
                    {
                        if (getX() + 60 < 1500 && isTouchEnemytank() == false)
                        {
                            moveRight();
                        }
                        try {
                            Thread.sleep(40);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2://向下
                    for (int i = 0; i < 95; i++)
                    {
                        if (getY() + 60 < 1250 && isTouchEnemytank() == false)
                        {
                            moveDown();
                        }
                        try {
                            Thread.sleep(40);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3://向左
                    for (int i = 0; i < 95; i++)
                    {
                        if (getX() > 0 && isTouchEnemytank() == false)
                        {
                            moveLeft();
                        }
                        try {
                            Thread.sleep(40);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }

            /*
            //单方向移动后，休眠50ms
            try {
                Thread.sleep(50); //这里的50ms没有问题啊！是你一开始的想法错了，就算你改成了5000ms也
                                  //是一样的效果，增加休眠时间仅仅是延迟了改变方向的时间，并没有增加
                                  //单方向的距离.
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
             */

            //再然后随机改变坦克的方向 0——3
            setDirect((int)(Math.random() * 4));//

            //听老韩说，写并发程序，一定要考虑清楚，该线程什么时候结束
            //那就是当敌人坦克的isLive值变为false时，该线程结束
            if (isLive == false)  //'isLive == false' can be simplified to '!isLive'
            {
                break;
            }
        }
    }
}
